package com.niiwoo.civet.account.dao.mapper;


import com.niiwoo.civet.account.dao.entity.RechargeOrder;
import com.niiwoo.civet.account.dto.RechargeAccountTotalDTO;
import com.niiwoo.civet.account.dto.request.RechargeAccountTypeRequestDTO;
import com.niiwoo.civet.account.dto.request.RechargeRecordRequestDTO;
import com.niiwoo.civet.account.dto.response.RechargeUpdateResponseDTO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

public interface RechargeOrderMapperExt extends RechargeOrderMapper{

    /**
     * 查找充值订单
     * @param requestNo
     * @return
     */
    RechargeOrder queryRechargeOrderByRequestNo(@Param("requestNo") String requestNo);

    /**
     * 通过主键查询记录并锁定
     * @param id
     * @return
     */
    RechargeOrder selectByPrimaryKeyForUpdate(Long id);

    /**
     * 查询用户的充值记录
     * @param rechargeRecordRequestDTO
     * @return
     */
    List<RechargeOrder> queryRechargeByUserId(RechargeRecordRequestDTO rechargeRecordRequestDTO);

    /**
     * 根据用户ID和账户ID查询用户的充值记录
     * @param rechargeRecordRequestDTO
     * @return
     */
    List<RechargeOrder> queryRechargeByUserIdAndAccountIds(RechargeRecordRequestDTO rechargeRecordRequestDTO);

    /**
     * 查询用户首次充值记录
     * @param userId
     * @return
     */
    RechargeOrder queryFirstRechrageSuccessRecord(String userId);

    /**
     * 用户充值记录的总个数
     * @param userId
     * @return
     */
    int countRechargeByUserId(String userId);

    /**
     * 根据用户ID和账户ID查询用户充值记录的总个数
     * @param userId
     * @return
     */
    int countRechargeByUserIdAndAccountIds(@Param("userId") String userId,@Param("accountIds") List<Long> accountIds);

    /**
     * 用户充值记录的总个数（增加状态）
     * @return
     */
    int countRechargeByUserIdAndStatus(RechargeRecordRequestDTO rechargeRecordRequestDTO);

    /**
     * 查询用户充值总金额
     * @param userId
     * @return
     */
    BigDecimal queryUserTotalRechrageAmount(String userId);

    /**
     * 根据用户ID和账户ID查询用户充值总金额
     * @param userId
     * @return
     */
    BigDecimal queryUserTotalRechrageAmountWithAccountIds(@Param("userId") String userId,@Param("accountIds") List<Long> accountIds);

    /**
     * 查询在处理中的标的，大于5分钟小于2天
     * @return
     */
    List<RechargeUpdateResponseDTO> queryOrderByStatus();

    /**
     * 查询用户最新的充值成功的记录
     * @param userId
     * @return
     */
    RechargeOrder userRechrageSuccRecord(String userId);

    /**
     * 根据用户ID和账户ID查询用户最新的充值成功的记录
     *
     * @param userId
     * @param accountIds
     * @return
     */
    RechargeOrder userRechrageSuccRecordWithAccountIds(@Param("userId") String userId,@Param("accountIds") List<Long> accountIds);

    BigDecimal statisticsRecharge(@Param("userId") String userId,@Param("status") List<Byte> status,@Param("accountIds") List<Long> accountIds);

    RechargeOrder queryLatelyRecharge(RechargeAccountTotalDTO rechargeAccountTotalDTO);

    BigDecimal queryCurrentDayRechargeMoney(RechargeAccountTotalDTO rechargeAccountTotalDTO);

    BigDecimal queryCurrentMonthRechargeMoney(RechargeAccountTotalDTO rechargeAccountTotalDTO);
}